
#include <iostream>
#include "../aed2/aed2.h"
#include "test.h"
#include "../src/diccAcotado.h"

using namespace std;

void test_construccion(ostream&){
    DiccAcotado<int> d(40);
    ASEGURAR(d,"{}");
    d.Definir(3,4);
    ASEGURAR(d,"{3:4}");
    d.Definir(5,6);
    ASEGURAR(d,"{5:6,3:4}");
    d.Definir(8,9);
    ASEGURAR(d, "{8:9,5:6,3:4}");
}

void test_obtener(ostream&){
    DiccAcotado<int> d(40);
    d.Definir(4,5);
    ASEGURAR(d.Obtener(4),5);
    d.Definir(4,6);
    ASEGURAR(d.Obtener(4),6);
}

void test_definido(ostream&){
    DiccAcotado<int> d(40);
    NEGAR(d.Definido(4));
    d.Definir(4,5);
    AFIRMAR(d.Definido(4));
    d.Definir(4,7);
    AFIRMAR(d.Definido(4));
}

void test_iterador(ostream&) {
	DiccAcotado<int> d(40);

	DiccAcotado<int>::const_Iterador it = d.CrearIt();

	NEGAR(it.HaySiguiente());

	d.Definir(1, 2);
	d.Definir(3, 4);
	d.Definir(9, 10);

	DiccAcotado<int>::const_Iterador it2 = d.CrearIt();

	AFIRMAR(it2.SiguienteClave() == 9);
	AFIRMAR(it2.SiguienteSignificado() == 10);
	AFIRMAR(it2.Siguiente().clave == it2.SiguienteClave());
	AFIRMAR(it2.Siguiente().significado == it2.SiguienteSignificado());
	it2.Avanzar();
	AFIRMAR(it2.HaySiguiente());


	AFIRMAR(it2.SiguienteClave() == 3);
	AFIRMAR(it2.SiguienteSignificado() == 4);
	AFIRMAR(it2.Siguiente().clave == it2.SiguienteClave());
	AFIRMAR(it2.Siguiente().significado == it2.SiguienteSignificado());
	AFIRMAR(it2.HaySiguiente());

	it2.Retroceder();

	AFIRMAR(it2.SiguienteClave() == 9);
	AFIRMAR(it2.SiguienteSignificado() == 10);
	AFIRMAR(it2.Siguiente().clave == it2.SiguienteClave());
	AFIRMAR(it2.Siguiente().significado == it2.SiguienteSignificado());
	it2.Avanzar();
	it2.Avanzar();
	AFIRMAR(it2.HaySiguiente());

	AFIRMAR(it2.SiguienteClave() == 1);
	AFIRMAR(it2.SiguienteSignificado() == 2);
	AFIRMAR(it2.Siguiente().clave == it2.SiguienteClave());
	AFIRMAR(it2.Siguiente().significado == it2.SiguienteSignificado());
	it2.Avanzar();
	NEGAR(it2.HaySiguiente());
}

int main(void) {
    Tester& tester = *Tester::Instance();
    tester.NuevoSet("Dict",0);
    tester.UsarSet("Dict");
    tester.Declarar("construccion",&test_construccion,0);
    tester.Declarar("Obtener",&test_obtener,0);
    tester.Declarar("definido",&test_definido,0);
    tester.Declarar("iterador",&test_iterador,0);
    tester.EjecutarTodos();

    return 0;
}

